﻿/*************************************************************************************
 * 工    具：  HK_TipSystem
 * 
 * 描    述：  HK_Tips 是一套三维场景中悬浮提示标签工具，可快速摆放编辑，运行时支持点击事件响应，主要功能如下：
 *            本工具是三维场景中，进行悬浮提示标签的便捷工具；
 *            可在场景中快速摆放编辑，运行时可通过点击的方式进行事件响应；
 * 
 * 版    本：  V1.1
 * 作    者：  京产肠饭
 * 
 * 创    建：  2024/03/28  V1.0
 *
 * 更    新：  2025/07/01  V1.1
 *            1.代码优化：减少冗余代码，提高代码可读性，提高运行时性能
 *            2.Bug修复：修复 OnValidate 编辑器下无法正确设置碰撞体激活/禁用的Bug
 *            3.功能新增：新增可根据距离动态调整LineRenderer线条粗细的功能
 * 
 * 链    接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using QFramework;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace HKTools
{
    public enum HK_TipGroup
    {
        TipGroup01,
        TipGroup02,
        TipGroup03,
        TipGroup04,
    }

    public interface IHK_TipSystem : ISystem
    {
        List<HK_TipsCtrl> TipsList { get; set; }

        /// <summary>
        /// 查询并找到 所有的 HKTip
        /// </summary>
        void InitOrResetAllTips();

        /// <summary>
        /// 手动添加 HKTip
        /// </summary>
        /// <param name="tip"></param>
        void AddTipItem(HK_TipsCtrl tip);

        /// <summary>
        /// 手动移除 HKTip
        /// </summary>
        /// <param name="tip"></param>
        void RemoveTipItem(HK_TipsCtrl tip);

        /// <summary>
        /// 显示激活 所有的 HKTip
        /// </summary>
        void ShowAllTips();

        /// <summary>
        /// 显示激活 HKTip
        /// </summary>
        void ShowTips(List<HK_TipsCtrl> tips);

        /// <summary>
        /// 显示激活 相应Group的 Tip
        /// </summary>
        void ShowTipsByGroup(HK_TipGroup group);

        /// <summary>
        /// 禁用隐藏 所有的 HKTip
        /// </summary>
        void HideAllTips();

        /// <summary>
        /// 禁用隐藏 HKTip
        /// </summary>
        void HideTips(List<HK_TipsCtrl> tips);

        /// <summary>
        /// 显示激活 相应Group的 Tip
        /// </summary>
        void HideTipsByGroup(HK_TipGroup group);

        /// <summary>
        /// 改变所有 HKTip 的可交互状态
        /// </summary>
        /// <param name="isActive"></param>
        void SetAllTipsState(bool isActive);
    }

    public class HK_TipSystem : AbstractSystem, IHK_TipSystem
    {
        public List<HK_TipsCtrl> TipsList { get; set; } = new List<HK_TipsCtrl>();

        protected override void OnInit()
        {
            InitOrResetAllTips();
        }

        public void InitOrResetAllTips()
        {
            // 查找场景中所有对象，包括隐藏的
            TipsList = Resources.FindObjectsOfTypeAll<HK_TipsCtrl>().ToList();

            // 获取当前活动场景
            Scene activeScene = SceneManager.GetActiveScene();

            TipsList = TipsList.Where(tip => tip.gameObject.scene == activeScene).ToList();

            TipsList.ForEach(tip => tip.Init());

            // HKDebug.Log("当前场景中HKTip共有：" + TipsList.Count, LogColor.Green, LogStyle.Bold);
        }

        public void AddTipItem(HK_TipsCtrl tip)
        {
            if (TipsList.Contains(tip))
                return;

            TipsList.Add(tip);
            tip.Init();
        }

        public void RemoveTipItem(HK_TipsCtrl tip)
        {
            if (!TipsList.Contains(tip))
                return;

            TipsList.Remove(tip);
        }

        public void ShowAllTips()
        {
            TipsList.ForEach(tip => tip.Show());
        }

        public void ShowTipsByGroup(HK_TipGroup group)
        {
            TipsList.Where(tip => tip.tipGroup == group).ToList().ForEach(tip => tip.Show());
        }

        public void HideAllTips()
        {
            TipsList.ForEach(tip => tip.Hide());
        }

        public void HideTipsByGroup(HK_TipGroup group)
        {
            TipsList.Where(tip => tip.tipGroup == group).ToList().ForEach(tip => tip.Hide());
        }

        public void SetAllTipsState(bool isActive)
        {
            TipsList.ForEach(tip =>
            {
                tip.SetIsCanClick(isActive);
            });
        }

        public void ShowTips(List<HK_TipsCtrl> tips)
        {
            tips.ForEach(tip => tip.Show());
        }

        public void HideTips(List<HK_TipsCtrl> tips)
        {
            tips.ForEach(tip => tip.Hide());
        }
    }
}